home *** CD-ROM | disk | FTP | other *** search
/ A.C.E. 2 / ACE CD 2.iso / FILES / UTILS / AMOS3.DMS / AMOS3.adf / Extensions / Compact.s next >
Text File  |  1978-10-10  |  16KB  |  720 lines

  1.  
  2.         Include    "Equ.s"
  3. GetEc        equ $18
  4. AdOrBank    equ $1C
  5. EffBank        equ $20
  6.     
  7. ******************************************************************
  8. *     **  *    * **** ****    ***    **  **** ***  ***
  9. *     *  * **  ** *  * *       *  *  *  * *     *  *
  10. *     **** * ** * *  * ****    ****  **** ****  *  *
  11. *     *  * *    * *  *    *    *   * *  *    *  *  *  
  12. *     *  * *    * **** ****    ****  *  * **** ***  ***
  13. ******************************************************************
  14. *    
  15. *    AMOS SCREEN COMPACTOR EXTENSION
  16. *    
  17. *    By Francois Lionet
  18. *
  19. *    AMOS (c) 1990 Mandarin / Jawx
  20. *
  21. ******************************************************************
  22. *    This source code is public domain. You can freely copy,
  23. * modify, distribute it. Experiment with it, and have fun!
  24. ******************************************************************
  25. *
  26. *    ABOUT THIS PROGRAM
  27. *
  28. *    This extension obeys to the same rules than the music extension.
  29. * Please refer to it for more information on AMOS interface.
  30. *    It uses the same compaction process than STOS screen compactor,
  31. * and have some nice features like automatic screen opening. For more
  32. * informations on AMOS internal libraries functions, please join the
  33. * AMOS club!
  34. *
  35. ******************************************************************
  36.  
  37.  
  38. ******************************************************************
  39. *    AMOS INTERFACE
  40.  
  41. *******    COLD START
  42.     lea    PacAdr(pc),a1
  43.     move.l    a0,(a1)            * Address of BRANCH TABLE
  44.     moveq    #0,d2            * No check bank
  45.     lea    Tk(pc),a0        * Address of TOKEN TABLE
  46.     lea    PacWel(pc),a1        * Address of WELCOME MESSAGE
  47.     lea    PacDef(pc),a2        * Address of SCREEN RESET
  48.     lea    PacEnd(pc),a3        * Address of QUIT
  49.     moveq    #1,d1            * Returns NUMBER OF EXTENSION
  50.     moveq    #0,d0            * NO ERRORS
  51.     rts
  52.  
  53. ******* SCREEN RESET
  54. PacDef:    rts
  55.  
  56. ******* QUIT
  57. PacEnd:    rts
  58.  
  59. ******* Call normal error messages
  60. Bkares    moveq    #35,d0
  61.     bra.s    IError
  62. OOMem    moveq    #24,d0            
  63.     bra.s    IError
  64. IFonc:    moveq    #23,d0            
  65. IError:    move.l    PacAdr(pc),a0        
  66.     jmp    4(a0)
  67. ******* Call customized error messages
  68. Noscr    moveq    #1,d0
  69.     bra.s    Custom
  70. Nopac    moveq    #0,d0
  71. Custom:    moveq    #0,d1            * Error can be trapped
  72.     lea    PacErr(pc),a0        * Your list
  73.     move.l    PacAdr(pc),a1
  74.     jmp    8(a1)
  75. ******* Debugging
  76. IBug:    move.l    PacAdr(pc),a0
  77.     jmp    (a0)
  78.  
  79. *******************************************************************
  80. *    PACK Screen,Bank#
  81. *    PACK Screen,Bank#,X1,Y1 TO X2,Y2
  82. Pack2    clr.l    -(a3)            * Y1
  83.     clr.l    -(a3)            * X1
  84.     move.l    #10000,-(a3)        * Y2
  85.     move.l    (a3),-(a3)        * X2
  86. Pack6    bsr    PacPar
  87.     bsr    GetSize
  88.     bsr    ResBank
  89.     bsr    Pack
  90.     rts
  91.     
  92. *******************************************************************
  93. *    SPACK Screen,Bank#[,X1,Y1 TO X2,Y2]
  94. SPack2    clr.l    -(a3)
  95.     clr.l    -(a3)
  96.     move.l    #10000,-(a3)
  97.     move.l    (a3),-(a3)
  98. SPack6    bsr    PacPar
  99.     bsr    GetSize
  100.     add.l    #PsLong,d0
  101.     bsr    ResBank
  102. * Screen definition header
  103.     move.l    #SCCode,(a1)
  104.     move.w    EcTx(a0),PsTx(a1)
  105.     move.w    EcTy(a0),PsTy(a1)
  106.     move.w    EcNbCol(a0),PsNbCol(a1)
  107.     move.w    EcNPlan(a0),PsNPlan(a1)
  108.     move.w    EcCon0(a0),PsCon0(a1)
  109.     move.w    EcAWX(a0),PsAWX(a1)
  110.     move.w    EcAWY(a0),PsAWY(a1)
  111.     move.w    EcAWTX(a0),PsAWTX(a1)
  112.     move.w    EcAWTY(a0),PsAWTY(a1)
  113.     move.w    EcAVX(a0),PsAVX(a1)
  114.     move.w    EcAVY(a0),PsAVY(a1)
  115.     movem.l    a0/a1,-(sp)
  116.     moveq    #31,d0
  117.     lea    EcPal(a0),a0
  118.     lea    PsPal(a1),a1
  119. SPac1    move.w    (a0)+,(a1)+
  120.     dbra    d0,SPac1
  121.     movem.l    (sp)+,a0/a1
  122.     lea    PsLong(a1),a1
  123. * Finish packing!
  124.     bsr    Pack
  125.     rts
  126.  
  127. ******* Reserves memory bank
  128. ResBank    movem.l    a0/d1,-(sp)
  129.     addq.l    #8,d0
  130.     move.l    d0,d1
  131.     SyCall    SyFast
  132.     beq    OOMem
  133.     move.l    d0,(a1)+
  134.     bset    #31,d1
  135.     move.l    d1,(a1)+
  136.     move.l    d0,a1
  137.     lea    BkPac(pc),a0
  138.     move.l    (a0)+,(a1)+
  139.     move.l    (a0)+,(a1)+
  140.     movem.l    (sp)+,a0/d1
  141.     rts
  142.  
  143. ******* Unpile parameters
  144. *    Screen-> a0/a2
  145. *    Bank  -> a1
  146. PacPar    move.l    (a3)+,d5
  147.     move.l    (a3)+,d4
  148.     move.l    (a3)+,d3
  149.     move.l    (a3)+,d2
  150.     lsr.w    #3,d4
  151.     lsr.w    #3,d2
  152. * Screen
  153.     move.l    4(a3),d1
  154.     move.l    PacAdr(pc),a0
  155.     jsr    GetEc(a0)
  156.     move.l    d0,a2
  157.     cmp.w    EcTLigne(a0),d4
  158.     bls.s    PacP1
  159.     move.w    EcTLigne(a0),d4
  160. PacP1    cmp.w    EcTy(a0),d5
  161.     bls.s    PacP2
  162.     move.w    EcTy(a0),d5
  163. PacP2    sub.w    d2,d4
  164.     ble    IFonc
  165.     sub.w    d3,d5
  166.     ble    IFonc
  167. * Memory bank
  168.     move.l    d3,-(sp)
  169.     move.l    (a3)+,d3
  170.     subq.l    #1,d3
  171.     cmp.l    #16,d3
  172.     bcc    IFonc
  173.     move.l    PacAdr(pc),a1        * Erase bank
  174.     jsr    EffBank(a1)
  175.     lsl.w    #3,d3            * Address of pointer
  176.     move.l    ABanks(a5),a1
  177.     add.w    d3,a1
  178.     tst.l    (a1)
  179.     bne    IFonc
  180.     move.l    (sp)+,d3
  181.     addq.l    #4,a3
  182.     rts
  183.     
  184. ***************************************************************************
  185. *       BITMAP COMPACTOR
  186. *                       A0: Origin screen datas
  187. *                       A1: Destination zone
  188. *            A2: Origin screen bitmap
  189. *                       D2: DX in BYTES
  190. *                       D3: DY in LINES
  191. *                       D4: TX in BYTES
  192. *                       D5: TY in LINES
  193. *
  194. ***************************************************************************
  195.  
  196. ***************************************************************************
  197. *     ESTIMATE THE SIZE OF A PICTURE
  198.  
  199. ******* Makes differents tries
  200. *    And finds the best square size in D1
  201. GetSize    movem.l    a1-a3,-(sp)
  202.     lea    TSize(pc),a3
  203.     move.l    Buffer(a5),a1
  204.     moveq    #0,d7
  205.     move.w    d5,d7
  206.     clr.w    -(sp)
  207.     move.l    #$10000000,-(sp)
  208. GSize1    move.l    d7,d5
  209.     move.w    (a3)+,d1
  210.     beq.s    GSize2
  211.     divu    d1,d5
  212.     swap    d5
  213.     tst.w    d5
  214.     bne.s    GSize1
  215.     swap    d5
  216.     bsr    PacSize
  217.     cmp.l    (sp),d0
  218.     bcc.s    GSize1
  219.     move.l    d0,(sp)
  220.     move.w    d1,4(sp)
  221.     bra.s    GSize1
  222. GSize2    move.l    (sp)+,d0
  223.     move.w    (sp)+,d1
  224.     move.l    d7,d5
  225.     divu    d1,d5
  226.     movem.l    (sp)+,a1-a3
  227.     rts
  228.  
  229. ******* Simulate a packing
  230. PacSize    movem.l    d1-d7/a0-a6,-(sp)
  231. * Fake data zone
  232.         move.w     d2,Pkdx(a1)
  233.         move.w     d3,Pkdy(a1)  
  234.         move.w     d4,Pktx(a1)  
  235.         move.w     d5,Pkty(a1)   
  236.         move.w     d1,Pktcar(a1)  
  237. * Reserve intermediate table space
  238.     move.w    d1,d0
  239.     mulu    d4,d0
  240.     mulu    d5,d0
  241.     mulu    EcNPlan(a0),d0
  242.     lsr.l    #3,d0
  243.     addq.l    #2,d0
  244.     move.l    d0,-(sp)
  245.     move.l    a0,-(sp)
  246.     SyCall    SyFast
  247.     beq    OoMem
  248.     move.l    (sp)+,a0
  249.     move.l    d0,a6
  250.     move.l    d0,-(sp)
  251. * Prepare registers
  252.         move.l    a2,a4                ;a4--> picture address
  253.         lea     PkDatas1(a1),a5            ;a5--> main datas
  254.     move.w    EcTLigne(a0),d7
  255.     move.w    d7,d5
  256.     mulu    d1,d5            ;d5--> SY line of square
  257.         move.w     Pkdy(a1),d3
  258.         mulu     d7,d3
  259.         move.w     Pkdx(a1),d0
  260.     ext.l    d0
  261.     add.l    d0,d3
  262.     move.w    EcNPlan(a0),-(sp)
  263. * Main packing
  264.         moveq     #7,d1                  * Bit pointer
  265.     moveq    #0,d0
  266. Iplan:  move.l     (a4)+,a3
  267.     add.l    d3,a3
  268.         move.w     Pkty(a1),d6
  269.     subq.w    #1,d6
  270. Iligne: move.l     a3,a2
  271.     move.w    Pktx(a1),d4
  272.     subq.w    #1,d4
  273. Icarre: move.l     a2,a0
  274.         move.w     Pktcar(a1),d2
  275.     subq.w    #1,d2
  276. Ioct0:     cmp.b     (a0),d0             * Compactage d'un carre
  277.         beq.s     Ioct1
  278.     move.b    (a0),d0
  279.         addq.l     #1,a5
  280.         bset     d1,(a6)
  281. Ioct1:  dbra     d1,Ioct2
  282.         moveq     #7,d1
  283.         addq.l     #1,a6
  284.     clr.b    (a6)
  285. Ioct2:  add.w     d7,a0
  286.         dbra     d2,Ioct0
  287.         addq.l    #1,a2    
  288.         dbra     d4,Icarre    
  289.     add.l    d5,a3    
  290.         dbra     d6,Iligne    
  291.     subq.w    #1,(sp)
  292.     bne.s    IPlan
  293.     addq.l    #2,sp
  294.     addq.l    #1,a5
  295. * Packing of first pointers table
  296.     move.l    a5,a6
  297.     move.l    4(sp),d2
  298.     move.l    d2,d0
  299.     subq.w    #1,d2
  300.     lsr.w    #3,d0
  301.     addq.w    #2,d0
  302.     add.w    d0,a5
  303.     move.l    (sp),a0
  304.     moveq    #0,d0
  305.         moveq     #7,d1
  306. Icomp2  cmp.b     (a0)+,d0
  307.         beq.s     Icomp2a
  308.     move.b    -1(a0),d0
  309.         addq.l     #1,a5
  310. Icomp2a dbra    d2,Icomp2
  311. * Final size (EVEN!)
  312.     move.l    a5,d2
  313.     sub.l    a1,d2
  314.     addq.l    #3,d2
  315.     and.l    #$FFFFFFFE,d2
  316. * Free intermediate memory
  317.     move.l    (sp)+,a1
  318.     move.l    (sp)+,d0
  319.     SyCall    SyFree
  320. * Finished!
  321.     move.l    d2,d0
  322.     movem.l    (sp)+,d1-d7/a0-a6
  323.     rts
  324.  
  325. ***********************************************************
  326. *    REAL PACKING!!!
  327. Pack:
  328.  
  329. * Header of the packed bitmap
  330.     movem.l    d1-d7/a0-a6,-(sp)
  331.  
  332. * Packed bitmap header
  333.         move.l     #BMCode,PkCode(a1)
  334.         move.w     d2,Pkdx(a1)
  335.         move.w     d3,Pkdy(a1)  
  336.         move.w     d4,Pktx(a1)  
  337.         move.w     d5,Pkty(a1)   
  338.         move.w     d1,Pktcar(a1)  
  339.     move.w    EcNPlan(a0),PkNPlan(a1)
  340.  
  341. * Reserve intermediate table space
  342.     move.w    d1,d0
  343.     mulu    d4,d0
  344.     mulu    d5,d0
  345.     mulu    EcNPlan(a0),d0
  346.     lsr.l    #3,d0
  347.     addq.l    #2,d0
  348.     move.l    d0,-(sp)
  349.     move.l    a0,-(sp)
  350.     SyCall    SyFast
  351.     beq    OoMem
  352.     move.l    (sp)+,a0
  353.     move.l    d0,a6
  354.     move.l    d0,-(sp)
  355.  
  356. * Prepare registers
  357.         move.l    a2,a4                ;a4--> picture address
  358.         lea     PkDatas1(a1),a5            ;a5--> main datas
  359.     move.w    EcTLigne(a0),d7
  360.     move.w    d7,d5
  361.     mulu    d1,d5            ;d5--> SY line of square
  362.         move.w     Pkdy(a1),d3
  363.         mulu     d7,d3
  364.         move.w     Pkdx(a1),d0
  365.     lsr.w    #3,d0
  366.     ext.l    d0
  367.     add.l    d0,d3
  368.     move.w    EcNPlan(a0),-(sp)
  369.  
  370. * Main packing
  371.         moveq     #7,d1                  * Bit pointer
  372.     moveq    #0,d0
  373.         clr.b     (a5)                  * First byte to zero
  374.         clr.b     (a6)              
  375. plan:   move.l     (a4)+,a3
  376.     add.l    d3,a3
  377.         move.w     Pkty(a1),d6
  378.     subq.w    #1,d6
  379. ligne:  move.l     a3,a2
  380.     move.w    Pktx(a1),d4
  381.     subq.w    #1,d4
  382. carre:  move.l     a2,a0
  383.         move.w     Pktcar(a1),d2
  384.     subq.w    #1,d2
  385. oct0:     cmp.b     (a0),d0             * Compactage d'un carre
  386.         beq.s     oct1
  387.     move.b    (a0),d0
  388.         addq.l     #1,a5
  389.         move.b     d0,(a5)
  390.         bset     d1,(a6)
  391. oct1:   dbra     d1,oct2
  392.         moveq     #7,d1
  393.         addq.l     #1,a6
  394.         clr.b     (a6)
  395. oct2:   add.w     d7,a0
  396.         dbra     d2,oct0
  397.         addq.l    #1,a2            * Carre suivant en X
  398.         dbra     d4,carre    
  399.     add.l    d5,a3            * Ligne suivante
  400.         dbra     d6,ligne    
  401.     subq.w    #1,(sp)            * Plan couleur suivant
  402.     bne.s    Plan
  403.     addq.l    #2,sp
  404.     addq.l    #1,a5
  405.  
  406. ; Packing of first pointers table
  407.     move.l    a5,d0
  408.     sub.l    a1,d0
  409.     move.l    d0,PkPoint2(a1)
  410.     move.l    a5,a6
  411.     move.l    4(sp),d0
  412.     move.l    d0,d2
  413.     subq.w    #1,d2
  414.     lsr.w    #3,d0
  415.     addq.w    #2,d0
  416.     add.w    d0,a5
  417.     move.l    a5,d0
  418.     sub.l    a1,d0
  419.     move.l    d0,PkDatas2(a1)
  420.     move.l    (sp),a0
  421.     moveq    #0,d0
  422.         moveq     #7,d1
  423.         clr.b     (a5)
  424.         clr.b     (a6)
  425. comp2:  cmp.b     (a0)+,d0
  426.         beq.s     comp2a
  427.     move.b    -1(a0),d0
  428.         addq.l     #1,a5
  429.         move.b     d0,(a5)
  430.         bset     d1,(a6)
  431. comp2a: dbra     d1,comp2b
  432.         moveq     #7,d1
  433.         addq.l     #1,a6
  434.         clr.b     (a6)
  435. comp2b: dbra    d2,Comp2
  436.  
  437. * Free intermediate memory
  438.     move.l    (sp)+,a1
  439.     move.l    (sp)+,d0
  440.     SyCall    SyFree
  441.     movem.l    (sp)+,d1-d7/a0-a6
  442.     rts
  443.  
  444. *************************************************************************
  445. *    UNPACK Bank#         -> To current screen
  446. *    UNPACK Bank#,X,Y    -> To current screen
  447. UPack1    move.l    ScOnAd(a5),d0
  448.     beq    IFonc
  449.     move.l    d0,a1
  450.     moveq    #-1,d1
  451.     moveq    #-1,d2
  452.     bra.s    UPack
  453. UPack3    move.l    ScOnAd(a5),d0
  454.     beq    IFonc
  455.     move.l    d0,a1
  456.     move.l    (a3)+,d2
  457.     move.l    (a3)+,d1
  458.     lsr.l    #3,d1
  459. UPack    movem.l    d1/d2/a1/a2,-(sp)
  460.     move.l    PacAdr(pc),a0
  461.     jsr    AdOrBank(a0)
  462.     movem.l    (sp)+,d1/d2/a1/a2
  463.     move.l    d3,a0
  464. * Autoback 
  465.     tst.w    EcAuto(a1)        * Is screen autobacked?
  466.     beq    UnPack            * NOPE! Do simple unpack
  467.     movem.l    d0-d7/a0-a2,-(sp)    * YEP! First step
  468.     EcCall    AutoBack1
  469.     movem.l    (sp),d0-d7/a0-a2
  470.     btst    #BitDble,EcFlags(a1)    * DOUBLE BUFFER?
  471.     beq.s    ABPac1
  472.     bsr    UnPack
  473.     EcCall    AutoBack2        * Second step
  474.     movem.l    (sp),d0-d7/a0-a2
  475.     bsr    UnPack
  476.     EcCall    AutoBack3        * Third step
  477.     bra.s    ABPac2
  478. ABPac1    bsr    UnPack            * SINGLE BUFFER autobacked
  479.     EcCall    AutoBack4
  480. ABPac2    movem.l    (sp)+,d0-d7/a0-a2
  481.     rts
  482.  
  483. *************************************************************************
  484. *    UNPACK Bank# TO screen    -> Creates/Erases screen!
  485. UPack2    move.l    (a3)+,d1
  486.     cmp.l    #8,d1
  487.     bcc    IFonc
  488. * Creates new screen
  489.     move.l    d1,-(sp)
  490.     move.l    PacAdr(pc),a0
  491.     jsr    AdOrBank(a0)
  492.     move.l    (sp)+,d1
  493.     move.l    d3,a0
  494.     cmp.l    #SCCode,PsCode(a0)
  495.     bne    NoScr
  496.     moveq    #0,d2
  497.     moveq    #0,d3
  498.     moveq    #0,d4
  499.     moveq    #0,d5
  500.     move.w    PsTx(a0),d2
  501.     move.w    PsTy(a0),d3
  502.     move.w    PsNPlan(a0),d4
  503.     move.w    PsCon0(a0),d5
  504.     move.w    PsNbCol(a0),d6
  505.     lea    PsPal(a0),a1
  506.     move.l    a0,-(sp)
  507.     EcCall    Cree
  508.     bne    OOMem
  509.     move.l    a0,a1
  510.     move.l    (sp)+,a0
  511.     move.l    a1,ScOnAd(a5)
  512.     move.w    EcNumber(a1),ScOn(a5)
  513.     addq.w    #1,ScOn(a5)
  514. * Change View/Offset
  515.     move.w    PsAWX(a0),EcAWX(a1)
  516.     move.w    PsAWY(a0),EcAWY(a1)
  517.     move.w    PsAWTx(a0),EcAWTx(a1)
  518.     move.w    PsAWTy(a0),EcAWTy(a1)
  519.     move.w    PsAVX(a0),EcAVX(a1)
  520.     move.w    PsAVY(a0),EcAVY(a1)
  521.     move.b    #%110,EcAW(a1)
  522.     move.b    #%110,EcAWT(a1)
  523.     move.b    #%110,EcAV(a1)
  524. * Unpack!
  525.     lea    PsLong(a0),a0
  526.     moveq    #0,d1
  527.     moveq    #0,d2
  528.     bsr    UnPack
  529.     rts
  530.  
  531. ******* Bitmap unpacker
  532. *    A0-> packed picture
  533. *    A1-> Destination screen
  534. *    D1.L Start in X
  535. *    D2.L Start in Y
  536. UAEc:    equ 0
  537. UDEc:    equ 4
  538. UITy:    equ 8
  539. UTy:    equ 10
  540. UTLine:    equ 12
  541. UNPlan:    equ 14
  542. UPile:    equ 16
  543. UnPack:    movem.l    a0-a6/d1-d7,-(sp)
  544.  
  545. * Jump over SCREEN DEFINITION
  546.     cmp.l    #SCCode,(a0)
  547.     bne.s    dec0
  548.     lea    PsLong(a0),a0
  549. * Is it a packed bitmap?
  550. dec0    cmp.l    #BMCode,(a0)
  551.     bne    NoPac
  552.  
  553. * Parameter preparation
  554.     lea    -UPile(sp),sp        * Space to work
  555.     lea    EcCurrent(a1),a2
  556.     move.l    a2,UAEc(sp)        * Bitmaps address
  557.         move.w     EcTLigne(a1),d7        * d7--> line size
  558.     move.w    EcNPlan(a1),d0        * How many bitplanes
  559.     cmp.w    PkNPlan(a0),d0
  560.     bne    IFonc
  561.     move.w    d0,UNPlan(sp)
  562.     move.w    Pktcar(a0),d6        * d6--> SY square
  563.  
  564.         tst.l     d1            * Screen address in X
  565.         bpl.s     dec1
  566.         move.w     Pkdx(a0),d1
  567. dec1:   tst.l     d2            * In Y
  568.         bpl.s     dec2
  569.         move.w     Pkdy(a0),d2
  570. dec2:   move.w    Pktx(a0),d0
  571.     add.w    d1,d0
  572.     cmp.w    d7,d0
  573.     bhi    IFonc
  574.     move.w    Pkty(a0),d0
  575.     mulu    d6,d0
  576.     add.w    d2,d0
  577.     cmp.w    EcTy(a1),d0
  578.     bhi    IFonc
  579.  
  580.     mulu    d7,d2            * Screen address
  581.     ext.l    d1    
  582.     add.l    d2,d1
  583.     move.l    d1,UDEc(sp)
  584.     
  585.     move.w    d6,d0            * Size of one line
  586.         mulu     d7,d0
  587.         move     d0,UTLine(sp)
  588.  
  589.         move.w     Pktx(a0),a3        * Size in X
  590.         subq.w    #1,a3
  591.         move.w     Pkty(a0),UITy(sp)    * in Y
  592.         lea     PkDatas1(a0),a4            * a4--> bytes table 1
  593.         move.l     a0,a5
  594.         move.l     a0,a6
  595.         add.l     PkDatas2(a0),a5         * a5--> bytes table 2
  596.         add.l     PkPoint2(a0),a6         * a6--> pointer table
  597.  
  598.         moveq     #7,d0            
  599.         moveq     #7,d1
  600.         move.b     (a5)+,d2
  601.         move.b     (a4)+,d3
  602.         btst     d1,(a6)
  603.         beq.s     prep
  604.         move.b     (a5)+,d2
  605. prep:   subq.w     #1,d1
  606.  
  607. * Unpack!
  608. dplan:  move.l     UAEc(sp),a2
  609.     addq.l    #4,UAEc(sp)
  610.     move.l    (a2),a2
  611.     add.l    UDEc(sp),a2
  612.         move.w     UITy(sp),UTy(sp)    * Y Heigth counter
  613. dligne: move.l     a2,a1
  614.         move.w     a3,d4
  615. dcarre: move.l     a1,a0
  616.         move.w     d6,d5           * Square height
  617. doctet1:subq.w     #1,d5
  618.         bmi.s     doct3
  619.         btst     d0,d2
  620.         beq.s     doct1
  621.         move.b     (a4)+,d3
  622. doct1:  move.b     d3,(a0)
  623.         add.w     d7,a0
  624.         dbra     d0,doctet1
  625.         moveq     #7,d0
  626.         btst     d1,(a6)
  627.         beq.s     doct2
  628.         move.b     (a5)+,d2
  629. doct2:  dbra     d1,doctet1
  630.         moveq     #7,d1
  631.         addq.l     #1,a6
  632.         bra.s     doctet1
  633. doct3:  addq.l    #1,a1               * Other squares?
  634.         dbra     d4,Dcarre
  635.         add.w     UTLine(sp),a2              * Other square line?
  636.         subq.w     #1,UTy(sp)
  637.         bne.s     Dligne
  638.         subq.w     #1,UNPlan(sp)
  639.         bne.s     Dplan
  640.         lea    UPile(sp),sp            * Restore the pile
  641. * Finished!
  642.     movem.l    (sp)+,a0-a6/d1-d7
  643.     rts
  644.  
  645.  
  646. ********************************************************
  647. *        DATA ZONE
  648.  
  649. *************** Packed screen header
  650.         RsReset
  651. PsCode        rs.l 1
  652. PsTx        rs.w 1
  653. PsTy        rs.w 1
  654. PsAWx        rs.w 1
  655. PsAWy        rs.w 1
  656. PsAWTx        rs.w 1
  657. PsAWTy        rs.w 1
  658. PsAVx        rs.w 1
  659. PsAVy        rs.w 1
  660. PsCon0        rs.w 1
  661. PsNbCol        rs.w 1
  662. PsNPlan        rs.w 1
  663. PsPal        rs.w 32
  664. PsLong        equ __Rs
  665. SCCode        equ $12031990
  666. *************** Packed picture header
  667.         RsReset
  668. Pkcode       rs.l 1
  669. Pkdx         rs.w 1
  670. Pkdy         rs.w 1
  671. Pktx         rs.w 1
  672. Pkty         rs.w 1
  673. Pktcar       rs.w 1
  674. Pknplan        rs.w 1
  675. PkDatas2     rs.l 1
  676. PkPoint2     rs.l 1
  677. PkLong      equ __Rs
  678. PkDatas1    equ __Rs
  679. BMCode        equ $06071963
  680.  
  681. ***********************************************************
  682. *         COMPACTOR TOKENS
  683. Tk:        dc.w     1,0
  684.         dc.b     $80,-1
  685.         dc.w     Pack2-Tk,1
  686.         dc.b     "!pac","k"+$80,"I0t0",-2
  687.         dc.w    Pack6-Tk,1
  688.         dc.b    $80,"I0t0,0,0,0,0",-1
  689.         dc.w     SPack2-Tk,1
  690.         dc.b     "!spac","k"+$80,"I0t0",-2
  691.         dc.w    SPack6-Tk,1
  692.         dc.b    $80,"I0t0,0,0,0,0",-1
  693.         dc.w    UPack1-Tk,1
  694.         dc.b    "!unpac","k"+$80,"I0",-2
  695.         dc.w     UPack2-Tk,1
  696.         dc.b    $80,"I0t0",-2
  697.         dc.w     UPack3-Tk,1
  698.         dc.b    $80,"I0,0,0",-1
  699.         dc.w     0
  700.  
  701. *************** Small data zone
  702. TSize:        dc.w 1,2,3,4,5,6,7,8,12,16,24,32,48,64,0
  703. PacAdr:        dc.l 0
  704.  
  705. *************** Definition banque de samples
  706. BkPac:        dc.b "Pac.Pic."
  707.  
  708. *************** Welcome message
  709. PacWel:        dc.b 27,"Y",48+9,"Picture compactor V 1.1",0
  710.  
  711. *************** ERROR MESSAGES
  712. PacErr:        dc.b "Not a packed bitmap",0
  713.         dc.b "Not a packed screen",0
  714.  
  715. ***************
  716.         dc.l    0
  717.  
  718.  
  719.